// 引入 axios
import axios from 'axios'
import { ElMessage, ElLoading } from 'element-plus'
import { getCurrentInfo } from './storage'

// 全局Loading实例
let loadingInstance: any = null

// 创建 axios 实例，将来对创建出来的实例，进行自定义配置
// 好处：不会污染原始的 axios 实例
const instance = axios.create({
  baseURL: 'http://localhost:8080/api', // 请求地址
  timeout: 5000, // 请求时间
  headers: {
    // 请求头携带数据
  },
})

// 自定义配置 - 请求/响应 拦截器
// 添加请求拦截器
instance.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    // 开启 loading 提示
    loadingInstance = ElLoading.service({
      lock: true,
      text: '加载中...',
      background: 'rgba(0, 0, 0, 0.7)',
      customClass: 'custom-loading'
    })

    // 获取当前端的token
    // const { token } = getCurrentInfo()
    // if (token) {
    //   config.headers['Access-Token'] = token
    // }

    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
)

// 添加响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么（默认axios会多包装一层data,需要响应拦截器处理一下）
    const res = response.data
    
    // 关闭loading
    if (loadingInstance) {
      loadingInstance.close()
      loadingInstance = null
    }
    
    if (res.code !== 200) {
      // 给错误提示
      ElMessage.error(res.message || '请求失败')

      // 抛出一个错误的 Promise
      // return Promise.reject(res.message)
    } else {
      // 成功情况，显示成功消息（可选）
      // ElMessage.success(res.message || '操作成功')
    }

    return res
  },
  (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    
    // 关闭loading
    if (loadingInstance) {
      loadingInstance.close()
      loadingInstance = null
    }
    
    // 显示错误消息
    const errorMessage = error.response?.data?.message || error.message || '网络错误'
    ElMessage.error(errorMessage)
    
    return Promise.reject(error)
  },
)

// 导出配置好的实例
export default instance
